
<?php

class Page
{
    private $total; //总记录数
    private $nums;  //每页显示的条数
    private $pages; // 总页数
    private $cur_page; // 当前页
    private $url; //当前URL

    public function __construct($total, $nums)
    {
        $this -> total = $total;
        $this -> nums = $nums;
        $this -> pages = $this -> getPages();
        $this -> url = $this -> getURL();
        //获取当前页
        $get_page = $_GET['page'];
        $this -> cur_page = $get_page;
    }
    // 获取分页
    public function showPage()
    {
        $arr = func_get_args();

        $show = "";
        // 将内容设置为数组显示
        $showArr[0] = "共{$this->total}条记录";
        $showArr[1] = "本页显示{$this->cur_lists()}条";
        $showArr[2] = "从{$this->start()}项到{$this->end()}项";
        $showArr[3] = "当前{$this->cur_page}页/共有{$this->pages}页";
        $showArr[4] = $this->firstPage();
        $showArr[5] = $this->pageList();
        $showArr[6] = $this->lastPage();

        if (count($arr) < 1) {
            $arr = [0,1,2,3,4,5,6];
        }
        // 遍历用户需要显示的内容
        foreach ($arr as $num) {
            $show .= $showArr[$num]." | ";
        }
        // 返回的同时去掉末位的分隔符
        return rtrim($show, " | ");
    }

    private function getURL()
    {
        //获取当前的url带参数的   test.php?a=b&c=d
                    $url = $_SERVER['REQUEST_URI'];

                    //判断是否有?，有?说明有参数  ?a=b&page=5
                    if (strstr($url, "?")) {
                        //使用 parse_url()函数将url分成 path (/test.php) 和query (a=b&page=5)两个部分
                        $arr= parse_url($url);
                        //如果有query下标在，说明有参数  $arr[query]="a=b&page=5"
                        if (isset($arr['query'])) {
                            //使用parse_str函数将参数a=b&c=d&page=5变成  $output['a']=b $output['c']=d $output['page']=5
                            parse_str($arr['query'], $output);
                        }

                        //删除数组中的 下标是page的
                        unset($output['page']);
                        //再使用http_build_query将关联数组变成参数字符串 a=b&c=d, 再和原来的path组合，
                        $url = $arr['path'].http_build_query($output);
                    }

        return $url;
    }
    // 获取页数
    private function getPages()
    {
        $pages = ceil($this -> total / $this -> nums) ; //ceil 向上取整
        return $pages;
    }
    // 第一项
    private function firstPage()
    {
        if ($this -> cur_page > 1) {
            $prev = $this -> cur_page - 1;
            return '<a href="'.$this->url.'?page=1">首页</a> <a href="'.$this->url.'?page='.$prev.'">上一页</a>';
        }
    }
    // 列表项
    private function pageList()
    {
        $num = 4;
        $list = "";
        // 当前页之前的页码

        for ($i=$num;$i>=1;$i--) {
            $page = $this -> cur_page - $i;
            if ($page >= 1) {
                $list .= ' <a href="'.$this->url.'?page='.$page.'">'.$page.'</a> ';
            }
        }
        if ($this -> pages > 1) {
            $list .= ' '.$this->cur_page.' ';
        }

        // 当前页之后的页码
        for ($i=1;$i<=$num;$i++) {
            $page = $this -> cur_page + $i;
            if ($page <= $this->pages) {
                $list .= ' <a href="'.$this->url.'?page='.$page.'">'.$page.'</a> ';
            } else {
                break;
            }
        }
        return $list;
    }
    // 末尾项
    private function lastPage()
    {
        if ($this -> cur_page < $this -> pages) {
            $next = $this -> cur_page + 1;
            return '<a href="'.$this->url.'?page='.$next.'">下一页</a> <a href="'.$this->url.'?page='.$this->pages.'">末页</a>';
        }
    }
    // 开始条目
    private function start()
    {
        return ($this -> cur_page -1) *$this -> nums +1;
    }
    // 结束条目
    private function end()
    {
        return min($this->cur_page*$this->nums, $this->total);
    }
    // 当前显示条数
    private function cur_lists()
    {
        return $this -> end() - $this -> start() + 1;
    }
}
